/*
 * Tabladirecciones.h
 *
 *  Created on: 13/10/2009
 *      Author: hernan
 */

#ifndef TABLADIRECCIONES_H_
#define TABLADIRECCIONES_H_
#include <string.h>
#include "ArchivoTexto.h"
#include <vector>
#include <stdlib.h>
#include <iostream>
#include <sstream>

using namespace std;

/* Esta tabla es utilizada por Indice Hash
 * Contiene un vector de enteros, Cada uno de ellos representa un numero de bloque.
 *
 */


class Tabladirecciones {

private:

	unsigned int TamanioTabla;

	vector <int> direcciones;

	ArchivoTexto *arch;

	string nombrearchivo;


public:
	Tabladirecciones();
	Tabladirecciones(const string& nombrearch);

	virtual ~Tabladirecciones();

	/* Crea la tabla de direcciones, leyendo sus datos de un archivo. En caso de que el archivo no existiera, se creara
	 * y se iniciara la tabla con un 0 en la posicion 0.
	 *
	 */
	int CrearTabla(const string& nombrearchivo);

	/* Metodo que recibe una posicion de la tabla de direcciones y devuelve el entero ubicado en ella.
	 */
	int DevolverNroCubo(unsigned int posiciontabla);

	/* Metodo que devuelve la cantidad de elementos de la tabla de direcciones.
	 *
	 */
	int GetTamanio();

	/* Metodo que recibe una posicion de la tabla de direcciones, y modifica su contenido, grabando el nuevonrocubo.
	 *
	 */
	void ModificarPosicion(int nuevonrocubo,int posicion);

	/*	Metodo que duplica la tabla de direcciones.
	 *
	 */
	void DuplicarTabla();

	/*	Funcion que graba en archivo la informacion de la tabla
	 * La serializacion se realiza de la siguiente forma:
	 *
	 * <TamanioTabla> / <NrodeBloque1> % <NrodeBloque2> %... <NrodeBloqueN>.
	 *
	 */
	void SerializarTabla();

	/* Funcion que levanta de archivo la informacion de la tabla
	 * Tamanio de Tabla, y numeros de bloques contenidos en ella
	 */
	void DeserealizarTabla();

	/*	Metodo que verifica si la primera mitad de la tabla de direcciones es exactamente igual a la segunda
	 * En caso de que la simetria se cumpla devuelve 0
	 * De lo contrario devuelve 1
	 */
	int VerificarSimetria();

	/*	Metodo que elimina la segunda mitad de la tabla de direcciones, diviendo por 2 su tamanio
	 */
	int AcortarTabla();

	/*	Metodo que busca ciclicamente en la tabla. Si la posicion que se encuentra a "tamanioDisp/2" posiciones tanto hacia
	 * adelante como hacia atras, contiene el mismo numero de bloque, significa que el bloque puede eliminarse.
	 * En cuyo caso devuelve el nro de bloque que sustituira la posicion inicial de la tabla de direcciones.
	 * De lo contrario devuelve -1
	 */
	int AnalizarBaja(int posicionInicial, int tamanioDisp);

};




#endif /* TABLADIRECCIONES_H_ */
